package com.wy.sloth.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import com.wy.sloth.util.StringUtils;
import com.wy.sloth.util.UUIDUtils;

import lombok.Getter;
import lombok.Setter;

/**
 * 消息结构体
 * 
 * @author wangyuan
 * @since 2019年1月31日
 */
@Getter
@Setter
public class SlothMessage implements Serializable {

    private static final long serialVersionUID = 4792358287325376660L;
    
    /**
     * 当为同步消息时，默认最大的同步等待消息回执时间
     */
    public static final long DEFAULT_WAIT_TIME = 1 * 60 * 60 * 1000L;

    /**
     * 消息唯一值
     */
    private String id;
    
    /**
     * 消息类型
     */
    private String type;
    
    /**
     * 消息发送时间戳
     */
    private long timeStamp;
    
    /**
     * 是否为同步消息，默认false
     */
    private boolean sync;
    
    /**
     * 单用户消息还是多用户消息，默认true
     */
    private boolean single;
    
    /**
     * 数据结构体
     */
    private JSONObject data;
    
    /**
     * 当{@link #sync}为true时，可通过此值设置同步等待的最大时间（毫秒）
     */
    @JSONField(serialize = false, deserialize = false)
    private Long maxWaitTime = DEFAULT_WAIT_TIME;
    
    /**
     * 消息处理对应的队列
     */
    @JSONField(serialize = false, deserialize = false)
    private String queueName;
    
    /**
     * 消息被处理的状态
     */
    @JSONField(serialize = false, deserialize = false)
    private Integer dealStatus;
    
    /**
     * 消息被处理失败的原因
     */
    @JSONField(serialize = false, deserialize = false)
    private String errorMsg;
    
    /**
     * 最后处理时间
     */
    @JSONField(serialize = false, deserialize = false)
    private Long updatedTime;
    
    /**
     * 消息处理的进展情况
     * queueName: 11
     * dealStatus: 2
     * errorMsg: 333
     * updatedTime: 111111111111
     */
    @JSONField(serialize = false, deserialize = false)
    private List<JSONObject> dealCondition;

    public SlothMessage(String type, boolean sync, boolean single, JSONObject data) {
        super();
        this.id = UUIDUtils.generateUUID();
        this.timeStamp = System.currentTimeMillis();
        this.type = type;
        this.sync = sync;
        this.single = single;
        this.data = data;
    }
    
    public SlothMessage(String type, JSONObject data) {
        this(type, false, true, data);
    }
    
    public SlothMessage(String type) {
        this(type, null);
    }
    
    public SlothMessage() {
        this(null);
    }
    
    /**
     * 对象实例json化
     * @return
     */
    public JSONObject toJsonObject(){
        return (JSONObject) JSONObject.toJSON(this);
    }
    
    public void addDealCondition(String queueName, Integer dealStatus, String errorMsg, Long updatedTime){
        if(dealCondition == null){
            dealCondition = new ArrayList<>();
        }
        
        JSONObject item = new JSONObject();
        item.put("queueName", queueName);
        item.put("dealStatus", dealStatus);
        item.put("errorMsg", StringUtils.isEmpty(errorMsg) ? "" : errorMsg);
        item.put("updatedTime", updatedTime);
        
        dealCondition.add(item);
    }

}
